স্প্রিং জেডিবিসি ব্যবহার করে ডাটাবেসের Stored Procedures এবং Stored Functions-এ সহজেই অ্যাক্সেস করা যায়। স্প্রিং এই কাজের জন্য বিশেষ SimpleJdbcCall
ক্লাস সরবরাহ করে, যা Stored Procedure বা Function কল করার জন্য একটি সরল এবং ফ্লেক্সিবল উপায় প্রদান করে।
Spring JDBC এর মাধ্যমে Stored Procedure-এ ইনপুট প্যারামিটার প্রদান করা, আউটপুট প্যারামিটার গ্রহণ করা এবং তাদের ব্যবহার সহজ।
একটি MySQL ডাটাবেসে একটি উদাহরণ Stored Procedure তৈরি করা হলো:
DELIMITER //
CREATE PROCEDURE GetStudentById(IN studentId INT, OUT studentName VARCHAR(50))
BEGIN
SELECT name INTO studentName FROM students WHERE id = studentId;
END //
DELIMITER ;
এখানে:
studentId
হলো ইনপুট প্যারামিটার।studentName
হলো আউটপুট প্যারামিটার।Spring এর কনফিগারেশন ক্লাসে JdbcTemplate
এবং DataSource
কনফিগার করা হবে।
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
@Service
public class StudentService {
@Autowired
private JdbcTemplate jdbcTemplate;
public String getStudentNameById(int id) {
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("GetStudentById")
.declareParameters(
new SqlParameter("studentId", Types.INTEGER), // Input parameter
new SqlOutParameter("studentName", Types.VARCHAR) // Output parameter
);
// প্যারামিটার ম্যাপিং
Map<String, Object> inputParams = new HashMap<>();
inputParams.put("studentId", id);
// Execute the procedure
Map<String, Object> outParams = simpleJdbcCall.execute(inputParams);
// Output parameter থেকে ডাটা রিটার্ন
return (String) outParams.get("studentName");
}
}
Service ক্লাস থেকে Stored Procedure কল করা:
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
StudentService studentService = context.getBean(StudentService.class);
String studentName = studentService.getStudentNameById(1);
System.out.println("Student Name: " + studentName);
}
Stored Procedure-এ একাধিক ইনপুট এবং আউটপুট প্যারামিটার থাকলে সেগুলো SimpleJdbcCall
এ ম্যাপ করা হয়।
DELIMITER //
CREATE PROCEDURE UpdateStudentGrade(IN studentId INT, IN newGrade VARCHAR(10), OUT successMessage VARCHAR(50))
BEGIN
UPDATE students SET grade = newGrade WHERE id = studentId;
SET successMessage = CONCAT('Grade updated for student ID ', studentId);
END //
DELIMITER ;
public String updateStudentGrade(int id, String grade) {
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("UpdateStudentGrade")
.declareParameters(
new SqlParameter("studentId", Types.INTEGER),
new SqlParameter("newGrade", Types.VARCHAR),
new SqlOutParameter("successMessage", Types.VARCHAR)
);
Map<String, Object> inputParams = new HashMap<>();
inputParams.put("studentId", id);
inputParams.put("newGrade", grade);
Map<String, Object> outParams = simpleJdbcCall.execute(inputParams);
return (String) outParams.get("successMessage");
}
যদি Stored Procedure শুধু ডাটা মডিফাই করে এবং কোনো আউটপুট প্যারামিটার রিটার্ন না করে, তাহলে execute
ব্যবহার করা যেতে পারে।
public void deleteStudentById(int id) {
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("DeleteStudent");
Map<String, Object> inputParams = new HashMap<>();
inputParams.put("studentId", id);
simpleJdbcCall.execute(inputParams);
System.out.println("Student deleted successfully.");
}
SimpleJdbcCall
ব্যবহার করে Stored Procedure কে সহজে কল করা যায়।Spring JDBC-তে Stored Procedure এর ব্যবহার ডেভেলপারদের জন্য খুবই সুবিধাজনক এবং শক্তিশালী। SimpleJdbcCall
ক্লাস এই প্রক্রিয়াটিকে সহজ করে এবং ডাটাবেসের সাথে মডিউলার ও পুনর্ব্যবহারযোগ্য সমাধান তৈরি করতে সাহায্য করে।
Stored Procedure হল একটি প্রি-কোম্পাইলড SQL স্টেটমেন্ট বা SQL কোডের একটি গ্রুপ যা ডেটাবেস সার্ভারের মধ্যে সংরক্ষিত থাকে এবং তখন ডেটাবেসে কোন অপারেশন সম্পাদন করতে ব্যবহার করা হয়। এটি একটি সি, জাভা, পিএইচপি ইত্যাদি প্রোগ্রামিং ভাষায় লেখা ফাংশনের মতো, তবে এটি ডেটাবেসে সংরক্ষিত থাকে এবং SQL কোয়েরি সমূহের একটি গ্রুপ থাকে যা পুনরায় একাধিক বার ব্যবহার করা যায়।
একটি Stored Procedure ডেটাবেসে সংরক্ষিত থাকে এবং ক্লায়েন্ট অ্যাপ্লিকেশন থেকে কল করা হয়। এটি ডেটাবেস সার্ভার দ্বারা এক্সিকিউট হয় এবং নির্দিষ্ট কাজ সম্পাদন করে, যেমন:
স্প্রিং জেডিবিসি তে Stored Procedure কল করতে SimpleJdbcCall
ক্লাস ব্যবহার করা হয়। এটি সহজে এবং কার্যকরভাবে স্টোরড প্রসিডিওর কল করতে সহায়ক।
ধরা যাক, আমাদের একটি স্টোরড প্রসিডিওর রয়েছে যেটি একটি Employee
টেবিল থেকে কোনো নির্দিষ্ট id
এর কর্মচারীর ডেটা রিটার্ন করবে।
Stored Procedure SQL:
CREATE PROCEDURE GetEmployeeById(IN empId INT)
BEGIN
SELECT * FROM Employee WHERE id = empId;
END;
Spring JDBC তে Stored Procedure কল করার কোড:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class EmployeeDao {
@Autowired
private JdbcTemplate jdbcTemplate;
// Method to call stored procedure and get employee by ID
public Employee getEmployeeById(int empId) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("GetEmployeeById")
.returningResultSet("result", new BeanPropertyRowMapper<>(Employee.class));
// Call stored procedure with input parameter
Map<String, Object> result = jdbcCall.execute(empId);
return (Employee) result.get("result");
}
}
ব্যাখ্যা:
SimpleJdbcCall
ব্যবহার করা হয়েছে GetEmployeeById
স্টোরড প্রসিডিওর কল করার জন্য।.withProcedureName("GetEmployeeById")
দ্বারা আমরা স্টোরড প্রসিডিওরের নাম নির্দিষ্ট করি।.returningResultSet("result", new BeanPropertyRowMapper<>(Employee.class))
এর মাধ্যমে ডেটাবেস থেকে রিটার্ন হওয়া রেজাল্ট ম্যানেজ করা হচ্ছে।Stored Procedures ডেটাবেসে জটিল ক্যালকুলেশন এবং অপারেশনগুলো সংরক্ষণ করতে সাহায্য করে, যা কর্মক্ষমতা, নিরাপত্তা এবং রক্ষণাবেক্ষণকে উন্নত করে। এটি ডেটাবেস লজিক এবং বিজনেস লজিককে একত্রিত করে এবং কোডের পুনরায় ব্যবহারযোগ্যতা বাড়ায়। স্প্রিং জেডিবিসি তে Stored Procedures কল করতে SimpleJdbcCall
ব্যবহার করা হয়, যা স্টোরড প্রসিডিওর কলের প্রক্রিয়াটি সহজ এবং কার্যকরী করে তোলে।
Spring JDBC-এ JdbcTemplate
ব্যবহার করে Stored Procedure কল করা একটি সাধারণ এবং কার্যকর পদ্ধতি। Stored Procedure হল ডেটাবেসের মধ্যে সংরক্ষিত একটি প্রি-কম্পাইল্ড SQL কুয়েরি বা গ্রুপ অফ কুয়েরি, যা বিশেষভাবে ডেটাবেসের কার্যক্রম দক্ষতার সাথে সম্পাদন করার জন্য তৈরি করা হয়। Spring JDBC-এ JdbcTemplate
ব্যবহার করে Stored Procedure কল করার জন্য দুটি মূল পদ্ধতি রয়েছে:
এখানে দুটি পদ্ধতির বিস্তারিত আলোচনা করা হলো।
এটি Spring JDBC-এর মূল API-তে একে অপরের সাথে কাজ করার জন্য দুটি ক্লাস CallableStatementCreator
এবং CallableStatementCallback
ব্যবহার করে।
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.CallableStatement;
import java.sql.SQLException;
public class JdbcTemplateStoredProcedureExample {
private JdbcTemplate jdbcTemplate;
public JdbcTemplateStoredProcedureExample(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void callStoredProcedure() {
String procedureCall = "{call my_stored_procedure(?, ?)}"; // Stored procedure এর কল
// Stored procedure কল করার জন্য CallableStatementCreator তৈরি
CallableStatementCreator csc = conn -> {
CallableStatement cs = conn.prepareCall(procedureCall);
cs.setInt(1, 10); // প্রথম প্যারামিটার প্রদান
cs.setString(2, "example"); // দ্বিতীয় প্যারামিটার প্রদান
return cs;
};
// CallableStatementCallback ব্যবহার করে Stored Procedure কল
jdbcTemplate.execute(csc, (CallableStatement cs) -> {
cs.execute(); // Stored Procedure এক্সিকিউট করা
return null;
});
}
}
এখানে:
CallableStatementCreator
একটি CallableStatement
তৈরি করে যেটি Stored Procedure কল করার জন্য ব্যবহৃত হবে।CallableStatementCallback
কলব্যাক হ্যান্ডলার যা Stored Procedure এক্সিকিউট করার জন্য ব্যবহৃত হয়।Spring 3.0 এর পর থেকে SimpleJdbcCall
ক্লাসটি Stored Procedure কল করার জন্য একটি সহজ এবং পরিষ্কার পদ্ধতি প্রদান করে। এটি JdbcTemplate
থেকে সহজে আলাদা করা যেতে পারে এবং আপনার কোড আরও পরিষ্কার এবং সংক্ষিপ্ত হতে পারে।
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlReturnResultSet;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import javax.sql.DataSource;
import java.sql.Types;
import java.util.Map;
public class SimpleJdbcCallExample {
private SimpleJdbcCall simpleJdbcCall;
public SimpleJdbcCallExample(DataSource dataSource) {
this.simpleJdbcCall = new SimpleJdbcCall(dataSource)
.withProcedureName("my_stored_procedure") // Stored Procedure নাম
.declareParameters(
new SqlParameter("param1", Types.INTEGER), // প্যারামিটার ১
new SqlParameter("param2", Types.VARCHAR) // প্যারামিটার ২
);
}
public void callStoredProcedure() {
// প্যারামিটার প্রদান
Map<String, Object> inParams = Map.of(
"param1", 10,
"param2", "example"
);
// Stored Procedure কল করা এবং আউটপুট প্রাপ্তি
Map<String, Object> result = simpleJdbcCall.execute(inParams);
// আউটপুট দেখানো
System.out.println("Result: " + result);
}
}
এখানে:
SimpleJdbcCall
ক্লাস ব্যবহার করা হচ্ছে, যা Stored Procedure কল করার জন্য একটি সহজ এবং সুসংহত পদ্ধতি।withProcedureName
দিয়ে Stored Procedure এর নাম প্রদান করা হয়েছে।declareParameters
ব্যবহার করে প্যারামিটারগুলো নির্ধারণ করা হচ্ছে।execute
মেথডের মাধ্যমে প্রক্রিয়াটি সম্পাদন করা হচ্ছে, এবং এটি আউটপুট (যদি থাকে) রিটার্ন করে।SimpleJdbcCall
ব্যবহার করে Stored Procedure কল করা অনেক সহজ এবং কোড সংক্ষিপ্ত করা যায়।Spring JDBC ব্যবহার করে Stored Procedure কল করা খুবই সহজ এবং প্রভাবশালী। JdbcTemplate
এর মাধ্যমে আপনি CallableStatement ব্যবহার করে অথবা SimpleJdbcCall এর মাধ্যমে Stored Procedure কল করতে পারেন। SimpleJdbcCall
নতুন এবং সুপারিশকৃত পদ্ধতি, যা কম কোড এবং উচ্চতর পঠনযোগ্যতা প্রদান করে।
Spring JDBC-তে SimpleJdbcCall ব্যবহার করে ডেটাবেসের Stored Procedure কল করা সহজ এবং কার্যকর। এটি JDBC API-এর জটিলতা সরিয়ে একটি সিম্পল এবং ক্লিন এপিআই প্রদান করে, যা ইনপুট ও আউটপুট প্যারামিটার ম্যানেজ করার পাশাপাশি প্রয়োজনীয় SQL কুয়েরি অটোমেটিক জেনারেট করতে পারে।
SimpleJdbcCall
হলো Spring JDBC-র একটি ক্লাস, যা Stored Procedure বা ফাংশন পরিচালনার জন্য ব্যবহার করা হয়। এটি Stored Procedure-এর ইনপুট এবং আউটপুট প্যারামিটারগুলোর জন্য অটোমেটিক মেটাডেটা রিট্রিভ করতে সক্ষম।
Spring JDBC এবং ড্রাইভার ডিপেন্ডেন্সি প্রয়োজন।
Maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
Spring Framework বা Spring Boot ব্যবহার করে DataSource
কনফিগার করুন।
Spring Boot (application.properties):
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Java Configuration (Spring Framework):
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
নিচের উদাহরণটি একটি MySQL Stored Procedure এর জন্য:
DELIMITER
DELIMITER ;
Spring JDBC-তে SimpleJdbcCall
ব্যবহার করে Stored Procedure কল করতে পারেন।
@Service
public class UserService {
private final SimpleJdbcCall simpleJdbcCall;
@Autowired
public UserService(JdbcTemplate jdbcTemplate) {
this.simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("GetUserById");
}
public String getUserById(int userId) {
// ইনপুট প্যারামিটার
SqlParameterSource inParams = new MapSqlParameterSource()
.addValue("userId", userId);
// Stored Procedure কল করা এবং আউটপুট প্যারামিটার রিসিভ করা
Map<String, Object> out = simpleJdbcCall.execute(inParams);
return (String) out.get("userName");
}
}
কোড ব্যাখ্যা:
SimpleJdbcCall
:withProcedureName("GetUserById")
দিয়ে Stored Procedure এর নাম উল্লেখ করা হয়।SqlParameterSource
:execute()
:public int getTotalUsers() {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("GetTotalUsers")
.declareParameters(
new SqlOutParameter("totalUsers", Types.INTEGER)
);
Map<String, Object> out = jdbcCall.execute();
return (Integer) out.get("totalUsers");
}
Stored Procedure:
DELIMITER
DELIMITER ;
Spring JDBC Implementation:
public String updateUserEmail(int userId, String newEmail) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("UpdateUserEmail");
SqlParameterSource inParams = new MapSqlParameterSource()
.addValue("userId", userId)
.addValue("newEmail", newEmail);
Map<String, Object> out = jdbcCall.execute(inParams);
return (String) out.get("statusMessage");
}
SimpleJdbcCall
একবার কনফিগার করলে বারবার ব্যবহার করা যায়।Spring JDBC-তে SimpleJdbcCall ব্যবহার করে Stored Procedure হ্যান্ডল করা সহজ, কার্যকর এবং রিডেবল। এটি ইনপুট ও আউটপুট প্যারামিটার ব্যবস্থাপনার কাজকে অনেকটাই সরল করে। ছোট থেকে মাঝারি প্রজেক্টের জন্য এটি অত্যন্ত উপযোগী।
Spring JDBC-তে Stored Procedures ব্যবহার করার মাধ্যমে আপনি ডেটাবেসে সংরক্ষিত পদ্ধতিগুলি (যা ডেটাবেস সার্ভারে সংরক্ষিত থাকে) কল করতে পারেন। এটি বিশেষত যখন ডেটাবেসের মধ্যে জটিল লজিক বা কোড থাকে এবং আপনি সেই লজিকগুলো অ্যাপ্লিকেশন লেভেলে না লিখে সরাসরি ডেটাবেস থেকে ব্যবহার করতে চান, তখন কার্যকর।
Spring JDBC-তে Stored Procedure কল করার জন্য JdbcTemplate
বা SimpleJdbcCall
ব্যবহার করা হয়। এখানে আমরা SimpleJdbcCall
এর মাধ্যমে Stored Procedure ব্যবহার করার উদাহরণ দেখব।
application.properties
ফাইলে ডেটাবেস কনফিগারেশনপ্রথমে, application.properties
ফাইলে ডেটাবেস কনফিগারেশন করতে হবে:
# DataSource Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
ধরা যাক, আমরা একটি Stored Procedure তৈরি করতে যাচ্ছি যা একটি কর্মীর তথ্য খুঁজে বের করবে তার আইডি দিয়ে। MySQL এ উদাহরণ:
DELIMITER
DELIMITER ;
এই Stored Procedure এর মাধ্যমে employee
টেবিল থেকে নির্দিষ্ট id
এর কর্মীর বিস্তারিত তথ্য পাওয়া যাবে।
Spring JDBC-তে Stored Procedure কল করার জন্য SimpleJdbcCall
ব্যবহার করা হয়, যা ডেটাবেসের Stored Procedure কল করার প্রক্রিয়াকে সরল করে দেয়।
import org.springframework.jdbc.core.SimpleJdbcCall;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.util.Map;
@Repository
public class EmployeeRepository {
private SimpleJdbcCall simpleJdbcCall;
// Constructor injection for DataSource
public EmployeeRepository(DataSource dataSource) {
this.simpleJdbcCall = new SimpleJdbcCall(dataSource)
.withProcedureName("getEmployeeDetails"); // Stored Procedure Name
}
public Map<String, Object> getEmployeeDetails(int empId) {
// Create input parameter map
Map<String, Object> inParams = Map.of("empId", empId);
// Execute stored procedure and get the result
Map<String, Object> result = simpleJdbcCall.execute(inParams);
return result;
}
}
এখন EmployeeService
ক্লাসে getEmployeeDetails
মেথডটি কল করুন:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class EmployeeService {
private final EmployeeRepository employeeRepository;
@Autowired
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public Map<String, Object> getEmployeeDetails(int empId) {
return employeeRepository.getEmployeeDetails(empId);
}
}
Spring MVC Controller তৈরি করে ওয়েব রেসপন্স এ getEmployeeDetails
মেথড কল করতে পারেন:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class EmployeeController {
private final EmployeeService employeeService;
@Autowired
public EmployeeController(EmployeeService employeeService) {
this.employeeService = employeeService;
}
@GetMapping("/employee/details")
public Map<String, Object> getEmployeeDetails(@RequestParam int empId) {
return employeeService.getEmployeeDetails(empId);
}
}
এখন, আপনি GET /employee/details?empId=1
কল করে কর্মীর বিস্তারিত তথ্য পেতে পারবেন।
এখন আপনি Spring Boot অ্যাপ্লিকেশনটি রান করতে পারেন এবং GET /employee/details?empId=1
এ গিয়ে Stored Procedure এর মাধ্যমে কর্মীর তথ্য পেতে পারবেন।
SimpleJdbcCall
তাতে ব্যবহৃত মানগুলিকে হ্যান্ডল করতে পারে। এই জন্য declareParameters
বা returningResultSet
মেথড ব্যবহার করা হয়।আউটপুট প্যারামিটার হ্যান্ডলিং: আউটপুট প্যারামিটার নিতে হলে SimpleJdbcCall
এ আউটপুট প্যারামিটার ঘোষণা করতে হয়।
উদাহরণ:
simpleJdbcCall = new SimpleJdbcCall(dataSource)
.withProcedureName("getEmployeeDetails")
.declareParameters(new SqlOutParameter("outParam", Types.VARCHAR));
স্টোরড প্রোসিডিউরের ইনপুট আর্গুমেন্ট: যখন আপনার স্টোরড প্রোসিডিউরে ইনপুট আর্গুমেন্ট থাকে, তখন আপনি সেগুলিকে Map
এর মাধ্যমে পাস করেন, যেমন:
Map<String, Object> inParams = Map.of("empId", empId);
Spring JDBC এর মাধ্যমে Stored Procedure ব্যবহারে আপনি ডেটাবেসের মধ্যে সংরক্ষিত লজিক সহজভাবে কল করতে পারেন, যা আপনার অ্যাপ্লিকেশনকে আরও কার্যকর এবং স্কেলেবল করে তোলে।
Read more